Computer programs employ the capabilities of a computer system to execute tasks that computer system user's desire performed. Typical examples of computer programs are word processors, spreadsheets and media players. Many computer programs have user interfaces that allow a computer system user to easily use and interact with the computer program.
Computer programs can contain errors or portions that do not operate desirably. These portions are called “bugs”. Bugs can arise from mistakes and errors that are present either in a computer program's source code or in it's design. Reports regarding program bugs in a computer program are referred to as bug reports, trouble reports, change requests, etc.
It should be appreciated that bugs can have a wide variety of effects that can result in varying levels of inconvenience to the user of the computer program. In many cases bugs can have only a slight effect on the computer programs functionality. Consequently, such bugs lie undetected for long periods of time. However, more serious bugs may cause the computer program to either crash or freeze.
Moreover, bugs can lead to security problems. For example, a bug causing a buffer to overflow can allow a malicious user to execute computer programs that are normally not allowed to run. Such bugs that provide access to programs that are normally prohibited can represent a serious threat to the security of affected computer systems.
Many computer software engineers and programmers use debuggers to investigate such computer bugs. Debuggers are computer programs that are used to debug other computer programs. Many debuggers are provided with the capacity to halt a computer program upon the occurrence of specific conditions. Such debuggers can offer sophisticated functions such as running a computer program step by step (single-stepping), stopping at the occurrence of an event, and tracking the values of variables.
There are several conventional approaches to collecting data for use in the debugging of computer programs. Some of the approaches involve the collection of computer program execution trace data that is generated by a computer system CPU. Modern CPUs that comply with the IEEE Nexus specification can be configured to provide computer program execution trace data. In one conventional approach, a probe is used to collect the computer program execution trace data in real time.
A significant disadvantage of conventional systems is that they can only single step forward through code. In addition, many conventional systems require external debuggers, which add overhead. In addition, many of such approaches require the re-compilation of the code.
The drawings referred to in this description should not be understood as being drawn to scale except if specifically noted.